/*	
	Universidad: Universidad Nacional de Río Cuarto (UNRC)
	Materia: Taller de Diseño de Software (Cod. 3306)
	Carrera: Licenciatura en Ciencias de la Computación
	Proyecto 2011: Compilador de un subconjunto del lenguaje C (C--).
	Integrantes:
		Bettiol, Matías Nicolas.
		Mattana, Diego Leonel.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../includes/Pila.h"
#include "../includes/Lista.h"

// Crea una pila.
Pila openPila(){
  return NULL;
}

//Inserta el elemento "e" en la pila.
void push(Pila *l , Lista e){
	NodoPila *p;
	p = malloc(sizeof( NodoPila));
	p->sig = (*l);
	p->e.nivel = e;
	(*l)= p;
}

// Retorna un elemento,
// El elemento devuelto ya no estará en la pila.
TElemPila pop(Pila *l){
	TElemPila e;
	e = (*l)->e;
	(*l) = (*l)->sig; 
	return e;
}

// Retorna 0 si la lista está vacia.
// Retorna 1 si la lista no esta vacia.
int vacia(Pila l){
	if(l == NULL)
		return 0;
	return 1;
}

// Retorna un puntero al elemento "e".
TElemLista* retornaElemento(Pila *l, TElemLista e){
	Pila pilaAuxiliar = *l;
	TElemPila telem;
	int a;
	while (pilaAuxiliar != NULL){
		Lista ant;
		telem = pop(&pilaAuxiliar);
		a = find(telem.nivel,e,&ant);
		if (a == 0 || a == 2)
			return findElemento(telem.nivel,e,&ant);
		}
	return ;
}

// Retorna 0 si el elemento "e" esta en la pila.
// Retorna 1 si el elemento "e" no esta en la pila.
int buscarElemento(Pila *l, TElemLista e){
	Pila pilaAuxiliar = *l;
	TElemPila telem;
	int a;
	while (pilaAuxiliar != NULL){
		Lista ant;
		telem = pop(&pilaAuxiliar);
		a = find(telem.nivel,e,&ant);
		if (a == 0 || a == 2)
			return 0;
		}
	return 1;
}

// Retorna el tipo del elemento "e".
char* buscarTipo(Pila *l, char* e){
	Pila pilaAuxiliar = *l;
	TElemPila telem;
	TElemLista telemLista;
	telemLista.nombre = e;
	int a;
	char* aux;
	if (*l != NULL){ 
		while (pilaAuxiliar != NULL){
			Lista ant;
			telem = pop(&pilaAuxiliar);
			a = find(telem.nivel,telemLista,&ant);
			if (a == 0 || a == 2){
				aux = (char*) retornaTipo(telem.nivel,telemLista.nombre,&ant);
				return aux;
			}
		}
	}
	aux = "NULL";
	return aux;
}

// Imprime el elemento "e" de la pila.
void printTElemPila(Lista e){
	printLista(e);
}

// Imprime la pila.
void printPila(Pila l){
	Pila act;
	act = l;
	int i = 0 ;
	if(l != NULL){
		printf("Nivel %i",i);
		i++;
		printTElemPila(act->e.nivel);
		while(act->sig != NULL){
			printf("Nivel %i",i);
			act = act->sig;
			printTElemPila(act->e.nivel);
			i++;
    	}
  	}
}

// Inserta el elemento "e" en la primera lista de la pila.
void pushElemento(Pila *l, TElemLista e){
	Pila aux = *l;
	TElemPila auxiliar = pop(&aux);
	Lista auxLista;
	auxLista = openLista();
	auxLista = auxiliar.nivel;
	add(&auxLista,e);
	push(&aux,auxLista);
	*l = aux;
}
